﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once

#include "GcmpModel.h"
#include "IFamilyLoadOptions.h"
#pragma warning(push)
#pragma warning(disable: 4996)
/// \brief 默认的族加载处理方式的实现
class GCMP_MODEL_EXPORT FamilyLoadOptionsDefaultImpl : public gcmp::IFamilyLoadOptions
{
public:
    FamilyLoadOptionsDefaultImpl(gcmp::FamilyFoundStrategy strategy = gcmp::FamilyFoundStrategy::FF_Create);

    /// \brief 当一个类别没有的时候， 则直接删除
    /// \param familyTypeName 没有的类别的名字
    /// \param instanceCount 这个类别都有多少个实例
    /// \param familyTypeInfo 可供替换的类别
    /// \return 返回只一个空的Id
    virtual gcmp::UniIdentity AskReplaceTypeOption(const std::wstring& familyTypeName, int instanceCount, const std::vector<const gcmp::IFamilyTypeInfo*>& familyTypeInfo) const override;

    /// \brief 当一个类别没有的时候， 询问使用哪一种类别替换,支持取消
    ///
    /// 当加载一个族， 如果这个族已经存在并且用覆盖的方式加载时， 如果一个类型在新的族中不存在， 就会回调这个函数， 询问使用哪一种类别替换
    /// \param familyTypeName 没有的类别的名字
    /// \param instanceCount 这个类别都有多少个实例
    /// \param familyTypeInfo 可供替换的类别
    /// \param uniIdentity 拿到替换的类别的Id
    /// \return 返回加载构件时的选项
    virtual gcmp::LoadOptions AskReplaceTypeOption(const std::wstring& familyTypeName, int instanceCount, const std::vector<const gcmp::IFamilyTypeInfo*>& familyTypeInfo, gcmp::UniIdentity& uniIdentity) const override;

    /// \brief 当载入一个族时， 如果这个族已经存在了， 询问加载的方式
    ///
    /// \return 返回加载的方式， 新建或覆盖
    virtual gcmp::FamilyFoundStrategy OnFamilyFound() const override;

private:
    gcmp::FamilyFoundStrategy m_strategy;
};
#pragma warning(pop)
